//============================================================================================
/**
 * @file	pkth_sel_sub.c
 * @brief	ポケスロン参加ポケモン選択アプリ	上画面
 * @author	Nozomu Saito
 *
 * モジュール名：PkthSelSub_
 */
//============================================================================================
#include "pkth_sel_sub.h"

#include "application/poke_select.h"

#include "system/arc_util.h"
#include "system/gra_tool.h"
#include "system/clact_tool.h"
#if 0
#include "poketool/boxdata.h"
#include "poketool/pokeparty.h"
#include "poketool/monsno.h"
#include "poketool/poke_tool.h"
#include "../../poketool/poke_tool_def.h"
#include "savedata/savedata.h"
#endif

#include "strbuf_family.h"
#include "system/wordset.h"
#include "system/msgdata_util.h"
#include "system/fontproc.h"
#include "system/pmfprint.h"
///#include "system/window.h"
#include "msgdata/msg.naix"
#include "pkthln_sel.naix"
#include "application/pst2_gra.naix"
#include "../../../field/field_cutin.naix"
#include "msgdata/msg_pkthln_sel.h"


//BMPウィンドウ定義
//コースウィンドウ
#define COURSE_WIN_SX	(1)
#define COURSE_WIN_SY	(1)
#define COURSE_WIN_W		(17)
#define COURSE_WIN_H		(2)
#define COURSE_WIN_SIZE	( COURSE_WIN_W*COURSE_WIN_H )
#define COURSE_WIN_BASE	(1)
//エキシビションウィンドウ
#define EX_WIN_SX	(22)
#define EX_WIN_SY	(1)
#define EX_WIN_W		(9)
#define EX_WIN_H		(2)
#define EX_WIN_SIZE	( EX_WIN_W*EX_WIN_H )
#define EX_WIN_BASE	(COURSE_WIN_BASE+COURSE_WIN_SIZE)
#if 0
//メッセージウィンドウ
#define MSG_WIN_SX	(1)
#define MSG_WIN_SY	(19)
#define MSG_WIN_W		(30)
#define MSG_WIN_H		(4)
#define MSG_WIN_SIZE	( MSG_WIN_W*MSG_WIN_H )
#define MSG_WIN_BASE	(EX_WIN_BASE+EX_WIN_SIZE)
#endif
//ニックネームウィンドウ
#define NAME_WIN_SX	(1)
#define NAME_WIN_SY	(15)
#define NAME_WIN_W		(8)
#define NAME_WIN_H		(2)
#define NAME_WIN_SIZE	( NAME_WIN_W*NAME_WIN_H )
#define NAME_WIN_BASE	(EX_WIN_BASE+EX_WIN_SIZE)
//性別ウィンドウ
#define SEX_WIN_SX	(9)
#define SEX_WIN_SY	(15)
#define SEX_WIN_W		(3)
#define SEX_WIN_H		(2)
#define SEX_WIN_SIZE	( SEX_WIN_W*SEX_WIN_H )
#define SEX_WIN_BASE	(NAME_WIN_BASE+NAME_WIN_SIZE)
//パラメータウィンドウ
#define PARAM_WIN_SX	(13)
#define PARAM_WIN_SY	(5)
#define PARAM_WIN_W		(10)
#define PARAM_WIN_H		(10)
#define PARAM_WIN_SIZE	( PARAM_WIN_W*PARAM_WIN_H )
#define PARAM_WIN_BASE	(SEX_WIN_BASE+SEX_WIN_SIZE)
//メダルウィンドウ
#define MEDAL_WIN_SX	(1)
#define MEDAL_WIN_SY	(19)
#define MEDAL_WIN_W		(12)
#define MEDAL_WIN_H		(4)
#define MEDAL_WIN_SIZE	( MEDAL_WIN_W*MEDAL_WIN_H )
#define MEDAL_WIN_BASE	(PARAM_WIN_BASE+PARAM_WIN_SIZE)

#define	FONT_PALNO_NORMAL	15	/* ノーマルパレット */
#define FONT_PAL_OFS		( FONT_PALNO_NORMAL*32 )
#define	MSG_FONT_COLOR		(GF_PRINTCOLOR_MAKE( 1, 2, 0))
#define	MSG_FONT_COLOR_FEMALE	(GF_PRINTCOLOR_MAKE( 3, 4, 0))
#define	MSG_FONT_COLOR_MALE		(GF_PRINTCOLOR_MAKE( 7, 8, 0))

//--アクター関連
#define SUB_DISTANCE	(256*FX32_ONE)
//上画面リソース開始ナンバー
#define RES_NO_START	(1)		//共通下画面のリソース番号が０番

//セルアクター最大数
#define CELL_ACTOR_MAX			( 1+5*2+(1+5*2)*5 )
//↑ポケ+(メダル+エフェクト)*5+( (アップダウン+星*2*5)*5 )
#define RES_NUM		(3)			//ポケモンステータス画面リソースとポケスロン選択上画面リソースとポケグラリソース
#define MEDAL_MAX	(5)			//メダル種類

///#define PEN_X	(16*8)
///#define PEN_Y	(12*8)
#define MEDAL_BASE_X	(13*8)
#define MEDAL_BASE_Y	(21*8)
#define MEDAL_OFS	(4*8)

#define ARROW_X			(12*8)
#define STAR_X			(21*8)
#define STAR_X_OFS		(2*8)
#define PARAM_BASE_Y	(6*8)
#define PARAM_Y_OFS	(8*2)
#define POKE_X	(8*6)
#define POKE_Y	(9*8)

///#define PEN_ANM_OFS	(6)
#define MEDAL_ANM_OFS	(0)
#define MEDAL_EFF_ANM_OFS	(5)

#define	STAR_NORM_ANM_OFS	(0)
#define	STAR_GOOD_ANM_OFS	(1)
#define	STAR_BAD_ANM_OFS	(2)
#define	STAR_MAX_ANM_OFS	(3)
#define	UP_ANM_OFS			(4)
#define	DOWN_ANM_OFS		(5)

///#define PRI_PEN		(0)
#define PRI_MEDAL	(2)
#define PRI_MEDAL_EFF	(1)
#define PRI_ARROW	(1)
#define PRI_STAR	(2)
#define PRI_POKE	(0)

#define PARAM_NUM	(5)
#define STAR_VAL_MAX	(5)

#define POKE_GRA_CHR_ADR_OFS	( (32*4+8*6)*32 )
//↑上画面キャラ128+ポケモンステータスキャラ48のオフセット後、ポケグラキャラアドレスになっている（グラフィックデータ依存）
#define POKE_GRA_PAL_ADR_OFS	(32)
//↑パレット１本分オフセット後、ポケグラパレットアドレスになっている（グラフィックデータ依存）
#define POKE_GRA_CHR_SIZE	(100*32)		//10ｘ10
#define POKE_GRA_PAL_SIZE	(32)

typedef struct PARAM_ACT_tag
{
	CLACT_WORK_PTR Arrow;
	CLACT_WORK_PTR Star[STAR_VAL_MAX];
}PARAM_ACT;

typedef struct PKTH_SEL_SUB_ACT_tag
{
	int HeapID;

	CLACT_SET_PTR	ClactSet;				// セルアクターセット
	CLACT_U_EASYRENDER_DATA RendData;			// 簡易レンダーデータ
	CLACT_U_RES_MANAGER_PTR ResMan[CLACT_U_RES_MAX];	// リソースマネージャ

	CLACT_U_RES_OBJ_PTR ResObjTbl[RES_NUM][CLACT_U_RES_MAX];	// リソースオブジェテーブル
	CLACT_HEADER ClActHeader;

	CLACT_WORK_PTR Medal[MEDAL_MAX];
	CLACT_WORK_PTR MedalEff[MEDAL_MAX];
	PARAM_ACT ParamAct[5];
	CLACT_WORK_PTR PokeAct;

	void *PokeChar;
	u16 PokePal[16];
	u32 ImageVram;
	u32 PaletteVram;
}PKTH_SEL_SUB_ACT;

typedef struct PKTH_SEL_SUB_tag
{
	int HeapID;
	GF_BGL_INI *bgl;
	GF_BGL_BMPWIN	CourseWin;
	GF_BGL_BMPWIN	ExhibitionWin;
	GF_BGL_BMPWIN	NameWin;
	GF_BGL_BMPWIN	SexWin;
	GF_BGL_BMPWIN	ParamWin;
	GF_BGL_BMPWIN	MedalWin;

	u16 CourseID;
	u16 AllStarFlg;

	MSGDATA_MANAGER	*MsgMng;
	WORDSET			*WordSet;
	//ポケモンニックネーム
	STRBUF *NickName;

	PKTH_SEL_SUB_ACT ActCnt;

}PKTH_SEL_SUB;

static void SetUpBG(GF_BGL_INI * ini, const int inHeapID);
static void BgInit(GF_BGL_INI * ini);
static void DrawBmp(PSS_CNT_PTR ptr);
static void UpdateText(PSS_CNT_PTR ptr, const PSS_REDRAW_INFO* inReDrawInfo);
static void UpdateAct(PSS_CNT_PTR ptr, const PSS_REDRAW_INFO* inReDrawInfo);
static void UpdateParam(PKTH_SEL_SUB_ACT *ptr, const PSS_REDRAW_INFO* inReDrawInfo);
static void VanishAct(PSS_CNT_PTR ptr);

//アクター関連
static void InitCellActor(PKTH_SEL_SUB_ACT *ptr);
static void SetActor(PKTH_SEL_SUB_ACT *ptr);
static CLACT_WORK_PTR AddAct(PKTH_SEL_SUB_ACT *ptr, u8 inResNo, u8 inActPri, u8 inBgPri, int inX, int inY, int inAnm, int inFlg);
static void MakeCLACT_ADD(CLACT_ADD *add, CLACT_SET_PTR	clactSet, CLACT_HEADER *header, const int inArea, const int inHeapID);
static void DeleteCellActor(PKTH_SEL_SUB_ACT *ptr);

static void AttouchPokeVramAdr( PKTH_SEL_SUB_ACT *ptr );
static void SetUpPokeAct(PKTH_SEL_SUB_ACT *ptr, const PSS_REDRAW_INFO* inReDrawInfo);
static void TransPokeGra( PKTH_SEL_SUB_ACT *ptr );


//パフォーマンスパラメータ配列インデックスと表示順番を合わせるためのテーブル
static const u8 PerformanceTbl[PARAM_NUM] = {
	1,//パワー
	3,//スタミナ
	2,//テクニック
	4,//ジャンプ
	0,//スピード
};

//--------------------------------------------------------------------------------------------
/**
 * メモリアロケーション
 *
 * @param	inHeapID		ヒープID
 *
 * @return	PSS_CNT_PTR		コントローラ
 */
//--------------------------------------------------------------------------------------------
PSS_CNT_PTR PkthSelSub_Alloc(const int inHeapID)
{
	PSS_CNT_PTR ptr;
	int size;
	size = sizeof(PKTH_SEL_SUB);

	ptr = sys_AllocMemory(inHeapID, size);
	MI_CpuClear8(ptr, size);

	ptr->HeapID = inHeapID;
	ptr->ActCnt.HeapID = inHeapID;
	return ptr;
}

//--------------------------------------------------------------------------------------------
/**
 * 初期化
 *
 * @param	ptr				管理ポインタ
 * @param	inBGL			BGL
 * @param	inCourseID		コースID
 * @param	inAllStarFlg	オールスターフラグ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PkthSelSub_Init(PSS_CNT_PTR ptr, GF_BGL_INI *inBGL, const u8 inCourseID, const u8 inAllStarFlg)
{
	//BGLセット
	ptr->bgl = inBGL;
	//ＢＧセットアップ
	SetUpBG(ptr->bgl, ptr->HeapID);

	// コースウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->CourseWin), GF_BGL_FRAME0_S,
			     COURSE_WIN_SX, COURSE_WIN_SY, COURSE_WIN_W, COURSE_WIN_H,
				 FONT_PALNO_NORMAL, COURSE_WIN_BASE);
	// エキシビションウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->ExhibitionWin), GF_BGL_FRAME0_S,
			     EX_WIN_SX, EX_WIN_SY, EX_WIN_W, EX_WIN_H,
				 FONT_PALNO_NORMAL, EX_WIN_BASE);
#if 0	//仕様変更で不要になった
	// メッセージウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->MsgWin), GF_BGL_FRAME0_S,
			     MSG_WIN_SX, MSG_WIN_SY, MSG_WIN_W, MSG_WIN_H,
				 FONT_PALNO_NORMAL, MSG_WIN_BASE);
#endif
	// ニックネームウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->NameWin), GF_BGL_FRAME1_S,
			     NAME_WIN_SX, NAME_WIN_SY, NAME_WIN_W, NAME_WIN_H,
				 FONT_PALNO_NORMAL, NAME_WIN_BASE);
	// 性別ウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->SexWin), GF_BGL_FRAME1_S,
			     SEX_WIN_SX, SEX_WIN_SY, SEX_WIN_W, SEX_WIN_H,
				 FONT_PALNO_NORMAL, SEX_WIN_BASE);
	// パラメータウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->ParamWin), GF_BGL_FRAME1_S,
			     PARAM_WIN_SX, PARAM_WIN_SY, PARAM_WIN_W, PARAM_WIN_H,
				 FONT_PALNO_NORMAL, PARAM_WIN_BASE);
	// メダルウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->MedalWin), GF_BGL_FRAME1_S,
			     MEDAL_WIN_SX, MEDAL_WIN_SY, MEDAL_WIN_W, MEDAL_WIN_H,
				 FONT_PALNO_NORMAL, MEDAL_WIN_BASE);

	//メッセージマネージャとワードセットの確保
	ptr->MsgMng = MSGMAN_Create(MSGMAN_TYPE_DIRECT, ARC_MSG, NARC_msg_pkthln_sel_dat, ptr->HeapID);
	ptr->WordSet = WORDSET_Create(ptr->HeapID);
	//ニックネームメモリ確保
	ptr->NickName = STRBUF_Create( MONS_NAME_SIZE+EOM_SIZE, ptr->HeapID );

	//コースIDセット
	ptr->CourseID = inCourseID;
	//オールスターフラグセット
	ptr->AllStarFlg = inAllStarFlg;

	//セルアクター初期化・ポケモンアイコンパレット転送
	InitCellActor(&ptr->ActCnt);
	//アクターを作成
	SetActor(&ptr->ActCnt);

	DrawBmp(ptr);

	//BG非表示
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
}

//--------------------------------------------------------------------------------------------
/**
 * リドロー
 *
 * @param	ptr				コントローラ
 * @param	inReDrawInfo	描画情報更新データ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PkthSelSub_ReDraw(PSS_CNT_PTR ptr, const PSS_REDRAW_INFO* inReDrawInfo)
{
#if 0		//仕様変更で不要になった
	if (ptr->First == FALSE){
		//ペン非表示
		CLACT_SetDrawFlag(ptr->ActCnt.Pen, 0);
		//下メッセージ非表示
		GF_BGL_BmpWinOff(&(ptr->MsgWin));
		ptr->First == TRUE;
	}
#endif
	if (inReDrawInfo->ReDraw == PSS_REDRAW_UPDATE){
		//アクター関連更新
		UpdateAct(ptr, inReDrawInfo);
		//テキスト情報更新
		UpdateText(ptr, inReDrawInfo);
		//BG表示
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_ON );
	}else{
		//アクター非表示
		VanishAct(ptr);
		//BG非表示
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	}
}

#if 0	//仕様変更で不要になった
//--------------------------------------------------------------------------------------------
/**
 * 開始描画状態セット
 *
 * @param	ptr				コントローラ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PkthSelSub_SetFirstDraw(PSS_CNT_PTR ptr)
{
	//アクター非表示
	VanishAct(ptr);
	//BG非表示
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	//ペン表示
	CLACT_SetDrawFlag(ptr->ActCnt.Pen, 1);
	//下メッセージ表示
	GF_BGL_BmpWinOn(&(ptr->MsgWin));
	//初回描画フラグクリア
	ptr->First == FALSE;
}
#endif

//--------------------------------------------------------------------------------------------
/**
 * 描画関数
 *
 * @param	ptr			コントローラ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PkthSelSub_Draw(PSS_CNT_PTR ptr)
{
	if(ptr->ActCnt.ClactSet!=NULL){
		CLACT_Draw( ptr->ActCnt.ClactSet );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * 解放
 *
 * @param	ptr		コントローラ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PkthSelSub_Free(PSS_CNT_PTR ptr)
{
	//メッセージマネージャ解放
	MSGMAN_Delete( ptr->MsgMng );
	//ワードセット解放
	WORDSET_Delete( ptr->WordSet );
	//ニックネーム解放
	STRBUF_Delete( ptr->NickName );

	//ウィンドウ削除
	GF_BGL_BmpWinDel(&ptr->CourseWin);
	GF_BGL_BmpWinDel(&ptr->ExhibitionWin);
///	GF_BGL_BmpWinDel(&ptr->MsgWin);		仕様変更で不要になった
	GF_BGL_BmpWinDel(&ptr->NameWin);
	GF_BGL_BmpWinDel(&ptr->SexWin);
	GF_BGL_BmpWinDel(&ptr->ParamWin);
	GF_BGL_BmpWinDel(&ptr->MedalWin);

	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME0_S);
	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME1_S);
	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME2_S);
	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME3_S);

	{
		u8 i;
		PKTH_SEL_SUB_ACT *act_cnt_ptr;
		act_cnt_ptr = &ptr->ActCnt;
		//アクター削除
		DeleteCellActor(act_cnt_ptr);
		for (i=0;i<RES_NUM;i++){
			// キャラ転送マネージャー破棄
			CLACT_U_CharManagerDelete(act_cnt_ptr->ResObjTbl[i][CLACT_U_CHAR_RES]);
			// パレット転送マネージャー破棄
			CLACT_U_PlttManagerDelete(act_cnt_ptr->ResObjTbl[i][CLACT_U_PLTT_RES]);
		}
		// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
		for(i=0;i<CLACT_U_RES_MAX;i++){
			CLACT_U_ResManagerDelete(act_cnt_ptr->ResMan[i]);
		}
		// セルアクターセット破棄
		CLACT_DestSet(act_cnt_ptr->ClactSet);
	}
	sys_FreeMemoryEz(ptr);
}

//------------------------------------------------------------------
/**
 * @brief	セルアクター削除
 *
 * @param	ptr		コントローラ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void DeleteCellActor(PKTH_SEL_SUB_ACT *ptr)
{
	int i,j;
#if 0		//仕様変更で不要になった
	//ペン
	CLACT_Delete(ptr->Pen);
#endif
	//メダル
	for (i=0;i<MEDAL_MAX;i++){
		CLACT_Delete(ptr->Medal[i]);
	}
	//パラメータ
	for (i=0;i<PARAM_NUM;i++){
		CLACT_Delete(ptr->ParamAct[i].Arrow);
		for(j=0;j<STAR_VAL_MAX;j++){
			CLACT_Delete(ptr->ParamAct[i].Star[j]);
		}
	}
	//ポケグラ
	CLACT_Delete(ptr->PokeAct);

	sys_FreeMemoryEz( ptr->PokeChar );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	BGセットアップ
 * @param	ini			BGL
 * @param	inHeapID	ヒープID
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetUpBG(GF_BGL_INI * ini, const int inHeapID)
{
	BgInit(ini);
	//BGパレット転送
	ArcUtil_PalSet(ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_u_nclr, PALTYPE_SUB_BG, 0, 0, inHeapID);
	//BGキャラ転送
	ArcUtil_BgCharSet(ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_u_lz_ccgr, ini,
			    GF_BGL_FRAME3_S, 0, 0, 1, inHeapID);
	//スクリーン転送
	ArcUtil_ScrnSet(ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_u1_lz_cscr, ini,
			  GF_BGL_FRAME3_S, 0, 32*24*2, 1, inHeapID);
	GF_BGL_LoadScreenReq(ini, GF_BGL_FRAME3_S);

	ArcUtil_ScrnSet(ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_u2_lz_cscr, ini,
			  GF_BGL_FRAME2_S, 0, 32*24*2, 1, inHeapID);
	GF_BGL_LoadScreenReq(ini, GF_BGL_FRAME2_S);

	//フォントパレットロード
	SystemFontPaletteLoad( PALTYPE_SUB_BG, FONT_PAL_OFS, inHeapID);

	OS_Printf("bmpsize = %d\n",COURSE_WIN_SIZE+EX_WIN_SIZE+NAME_WIN_SIZE+ \
			SEX_WIN_SIZE+PARAM_WIN_SIZE+MEDAL_WIN_SIZE);
/**
	//1キャラ目をＮＵＬＬデータでフィルする
	GF_BGL_CharFill(ini, GF_BGL_FRAME0_S, 0, 1 ,0);
*/
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	BG初期化
 * @param	ini		BGL
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void BgInit(GF_BGL_INI * ini)
{
	{	/* SUB DISP BG0 */				//書き直し不要テキスト面
    	GF_BGL_BGCNT_HEADER SBg0_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xe000, GX_BG_CHARBASE_0x00000,
      		GX_BG_EXTPLTT_01, 0, 0, 0, FALSE
    	};
    	GF_BGL_BGControlSet( ini, GF_BGL_FRAME0_S, &SBg0_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME0_S );
	}

	{	/* SUB DISP BG1 */
		GF_BGL_BGCNT_HEADER SBg1_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xe800, GX_BG_CHARBASE_0x00000,
      		GX_BG_EXTPLTT_01, 1, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME1_S, &SBg1_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME1_S );
	}

	{	/* SUB DISP BG2 */
		GF_BGL_BGCNT_HEADER SBg2_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf000, GX_BG_CHARBASE_0x08000,
      		GX_BG_EXTPLTT_23, 2, 0, 0, FALSE
    	};
    	GF_BGL_BGControlSet( ini, GF_BGL_FRAME2_S, &SBg2_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME2_S );
	}

	{	/* SUB DISP BG3 */
		GF_BGL_BGCNT_HEADER SBg3_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x08000,
      		GX_BG_EXTPLTT_23, 3, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME3_S, &SBg3_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME3_S );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	BMPプリント
 * @param	ptr			コントローラ
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void DrawBmp(PSS_CNT_PTR ptr)
{
	STRBUF * msg;
	OS_Printf("crs=%d\n",ptr->CourseID);
	//コース
	WORDSET_RegisterPkthlnCourse( ptr->WordSet, 0, ptr->CourseID );
	msg = MSGDAT_UTIL_AllocExpandString(ptr->WordSet, ptr->MsgMng, pkth_sel_crs, ptr->HeapID);
	GF_BGL_BmpWinDataFill(&(ptr->CourseWin), MSG_FONT_COLOR);
	GF_STR_PrintColor(&(ptr->CourseWin), FONT_SYSTEM, msg, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
	GF_BGL_BmpWinOn(&(ptr->CourseWin));
	STRBUF_Delete(msg);

	//エキシビション
	GF_BGL_BmpWinDataFill(&(ptr->ExhibitionWin), MSG_FONT_COLOR);
	if (ptr->AllStarFlg){
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_ex);
		GF_STR_PrintColor(&(ptr->ExhibitionWin), FONT_SYSTEM, msg, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
	}
	GF_BGL_BmpWinOn(&(ptr->ExhibitionWin));
#if 0		//仕様変更で不要になった
	//メッセージ
	msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_msg);
	GF_BGL_BmpWinDataFill(&(ptr->MsgWin), MSG_FONT_COLOR);
	GF_STR_PrintColor(&(ptr->MsgWin), FONT_SYSTEM, msg, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
	GF_BGL_BmpWinOn(&(ptr->MsgWin));
	STRBUF_Delete(msg);
#endif
	//パラメータ
	GF_BGL_BmpWinDataFill(&(ptr->ParamWin), MSG_FONT_COLOR);
	{
		//スピード
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_speed);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//パワー
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_power);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*1, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//テクニック
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_technique);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*2, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//スタミナ
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_stamina);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*3, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//ジャンプ
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_jump);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*4, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);

	}
	GF_BGL_BmpWinOn(&(ptr->ParamWin));
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	BMPプリント
 *
 * @param	ptr					コントローラ
 * @param	inReDrawInfo		再描画情報
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void UpdateText(PSS_CNT_PTR ptr, const PSS_REDRAW_INFO* inReDrawInfo)
{
	STRBUF *str;
	//ニックネーム
	{
		STRBUF_SetStringCode( ptr->NickName, inReDrawInfo->NickName );
		GF_BGL_BmpWinDataFill( &ptr->NameWin, MSG_FONT_COLOR);
		GF_STR_PrintColor( 	&ptr->NameWin, FONT_SYSTEM, ptr->NickName, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
		GF_BGL_BmpWinOn(&ptr->NameWin);
	}
	//性別
	if (inReDrawInfo->Sex == PM_MALE){		//オス
		str = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_male);
		GF_BGL_BmpWinDataFill(&(ptr->SexWin), MSG_FONT_COLOR_MALE);
		GF_STR_PrintColor(&(ptr->SexWin), FONT_SYSTEM, str, 4, 0, MSG_NO_PUT, MSG_FONT_COLOR_MALE, NULL);
		GF_BGL_BmpWinOn(&(ptr->SexWin));
		STRBUF_Delete(str);
	}else if (inReDrawInfo->Sex == PM_FEMALE){	//メス
		str = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_female);
		GF_BGL_BmpWinDataFill(&(ptr->SexWin), MSG_FONT_COLOR_FEMALE);
		GF_STR_PrintColor(&(ptr->SexWin), FONT_SYSTEM, str, 4, 0, MSG_NO_PUT, MSG_FONT_COLOR_FEMALE, NULL);
		GF_BGL_BmpWinOn(&(ptr->SexWin));
		STRBUF_Delete(str);
	}else{
		GF_BGL_BmpWinDataFill(&(ptr->SexWin), MSG_FONT_COLOR);
		GF_BGL_BmpWinOn(&(ptr->SexWin));
	}

	//種族名を入れたメダルメッセージ
	{
		STRBUF *name;
		name = MSGDAT_UTIL_GetMonsName( inReDrawInfo->MonsNo, ptr->HeapID );
		WORDSET_RegisterWord( ptr->WordSet, 0, name, PM_NEUTRAL, TRUE, PM_LANG );
		STRBUF_Delete(name);
		str = MSGDAT_UTIL_AllocExpandString(ptr->WordSet, ptr->MsgMng, pkth_sel_medal, ptr->HeapID);
		GF_BGL_BmpWinDataFill(&(ptr->MedalWin), MSG_FONT_COLOR);
		GF_STR_PrintColor( 	&ptr->MedalWin, FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
		GF_BGL_BmpWinOn(&(ptr->MedalWin));
		STRBUF_Delete(str);
	}
}


//アクター関連
//--------------------------------------------------------------------------------------------
/**
 * @brief	アクター関連更新
 * @param	ptr					コントローラ
 * @param	inReDrawInfo		更新情報
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void UpdateAct(PSS_CNT_PTR ptr, const PSS_REDRAW_INFO* inReDrawInfo)
{
	u8 i;
	PKTH_SEL_SUB_ACT *cnt_ptr = &ptr->ActCnt;

	SetUpPokeAct(&ptr->ActCnt, inReDrawInfo);
	TransPokeGra( &ptr->ActCnt );
	//ポケグラ
	CLACT_SetDrawFlag(ptr->ActCnt.PokeAct, 1);
	//ステータス
	UpdateParam(&ptr->ActCnt, inReDrawInfo);
	//メダル
	{
		//描画順番テーブル
		u8 pos_tbl[MEDAL_TYPE_MAX] = {CRS_ID_POW,CRS_ID_STA,CRS_ID_TEQ,CRS_ID_JMP,CRS_ID_SPD};
		u8 idx;
		for (i=0;i<MEDAL_TYPE_MAX;i++){
			idx = pos_tbl[i];
			if ( inReDrawInfo->Medal[idx]  ){
				CLACT_SetDrawFlag(cnt_ptr->Medal[idx], 1);
			}else{
				CLACT_SetDrawFlag(cnt_ptr->Medal[idx], 0);
			}
		}
	}
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケスロンパラメータ表示更新
 * @param	ptr					コントローラ
 * @param	inReDrawInfo		更新情報
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void UpdateParam(PKTH_SEL_SUB_ACT *ptr, const PSS_REDRAW_INFO* inReDrawInfo)
{
	u8 i,j;
	for (i=0;i<PKTH_PARAM_NUM;i++){
		//アップダウン表示
		if (inReDrawInfo->Param[i].UpDown > 0){
			CLACT_SetDrawFlag(ptr->ParamAct[i].Arrow, 1);
			CLACT_AnmChg(ptr->ParamAct[i].Arrow, UP_ANM_OFS);
		}else if(inReDrawInfo->Param[i].UpDown < 0){
			CLACT_SetDrawFlag(ptr->ParamAct[i].Arrow, 1);
			CLACT_AnmChg(ptr->ParamAct[i].Arrow, DOWN_ANM_OFS);
		}else{
			CLACT_SetDrawFlag(ptr->ParamAct[i].Arrow, 0);
		}
		//星アクターをすべて非表示
		for(j=0;j<STAR_VAL_MAX;j++){
			switch( inReDrawInfo->Param[i].Stars[j] ){
			case 0:	//非表示
				CLACT_SetDrawFlag(ptr->ParamAct[i].Star[j], 0);
				break;
			case 1:	//空
				CLACT_SetDrawFlag(ptr->ParamAct[i].Star[j], 1);
				CLACT_AnmChg(ptr->ParamAct[i].Star[j], STAR_MAX_ANM_OFS);
				break;
			case 2:	//ノーマル
				CLACT_SetDrawFlag(ptr->ParamAct[i].Star[j], 1);
				CLACT_AnmChg(ptr->ParamAct[i].Star[j], STAR_NORM_ANM_OFS);
				break;
			case 3:	//良い
				CLACT_SetDrawFlag(ptr->ParamAct[i].Star[j], 1);
				CLACT_AnmChg(ptr->ParamAct[i].Star[j], STAR_GOOD_ANM_OFS);
				break;
			case 4:	//悪い
				CLACT_SetDrawFlag(ptr->ParamAct[i].Star[j], 1);
				CLACT_AnmChg(ptr->ParamAct[i].Star[j], STAR_BAD_ANM_OFS);
				break;
			default:
				GF_ASSERT(0);
			}
		}
	}
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アクター非表示
 * @param	ptr					コントローラ
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VanishAct(PSS_CNT_PTR ptr)
{
	u8 i,j;
	PKTH_SEL_SUB_ACT *cnt_ptr = &ptr->ActCnt;

	//メダル
	for (i=0;i<MEDAL_MAX;i++){
		CLACT_SetDrawFlag(cnt_ptr->Medal[i], 0);
		CLACT_SetDrawFlag(cnt_ptr->MedalEff[i], 0);
	}
	//ステータス
	for (i=0;i<PARAM_NUM;i++){
		CLACT_SetDrawFlag(cnt_ptr->ParamAct[i].Arrow, 0);
		for(j=0;j<STAR_VAL_MAX;j++){
			CLACT_SetDrawFlag(cnt_ptr->ParamAct[i].Star[j], 0);
		}
	}
	//ポケグラ
	CLACT_SetDrawFlag(cnt_ptr->PokeAct, 0);
}

//------------------------------------------------------------------
/**
 * @brief	セルアクターの初期化
 * @param	ptr		ワークポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void InitCellActor(PKTH_SEL_SUB_ACT *ptr)
{
	int i;
	// セルアクター初期化
	ptr->ClactSet = CLACT_U_SetEasyInit( CELL_ACTOR_MAX, &ptr->RendData, ptr->HeapID);

	//サブ画面ディスタンス設定
	CLACT_U_SetSubSurfaceMatrix( &ptr->RendData, 0, SUB_DISTANCE );
	GF_Disp_GXS_VisibleControl(  GX_PLANEMASK_OBJ, VISIBLE_ON );	//サブ画面OBJ面ＯＮ

	//リソースマネージャー初期化
	for(i=0;i<CLACT_U_RES_MAX;i++){	//リソースマネージャー作成
		ptr->ResMan[i] = CLACT_U_ResManagerInit(RES_NUM, i, ptr->HeapID);
	}

	//---------ポケスロン選択上画面-------------------
	//chara読み込み
	ptr->ResObjTbl[0][CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(ptr->ResMan[CLACT_U_CHAR_RES],
					    ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_oam_u_lz_ccgr,
					    1, RES_NO_START, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	//pal読み込み
	ptr->ResObjTbl[0][CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(ptr->ResMan[CLACT_U_PLTT_RES],
					    ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_oam_u_nclr,
					    0, RES_NO_START, NNS_G2D_VRAM_TYPE_2DSUB, 4, ptr->HeapID);

	//cell読み込み
	ptr->ResObjTbl[0][CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELL_RES],
						ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_oam_u_lz_ccer,
						1, RES_NO_START, CLACT_U_CELL_RES,ptr->HeapID);

	//同じ関数でanim読み込み
	ptr->ResObjTbl[0][CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELLANM_RES],
						ARC_PKTH_SEL_GRA, NARC_pkthln_sel_pkthln_sel_box_oam_u_lz_canr,
						1, RES_NO_START, CLACT_U_CELLANM_RES,ptr->HeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( ptr->ResObjTbl[0][CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( ptr->ResObjTbl[0][CLACT_U_PLTT_RES] );

	//---------ポケモンステータス画面-------------------
	//chara読み込み
	ptr->ResObjTbl[1][CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(ptr->ResMan[CLACT_U_CHAR_RES],
					    ARC_POKESTATUS_GRA, NARC_pst2_gra_ps_sub_obj_NCGR,
					    0, RES_NO_START+1, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	//pal読み込み
	ptr->ResObjTbl[1][CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(ptr->ResMan[CLACT_U_PLTT_RES],
					    ARC_POKESTATUS_GRA, NARC_pst2_gra_ps_sub_obj_NCLR,
					    0, RES_NO_START+1, NNS_G2D_VRAM_TYPE_2DSUB, 4, ptr->HeapID);

	//cell読み込み
	ptr->ResObjTbl[1][CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELL_RES],
						ARC_POKESTATUS_GRA, NARC_pst2_gra_ps_sub_obj_NCER,
						0, RES_NO_START+1, CLACT_U_CELL_RES,ptr->HeapID);

	//同じ関数でanim読み込み
	ptr->ResObjTbl[1][CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELLANM_RES],
						ARC_POKESTATUS_GRA, NARC_pst2_gra_ps_sub_obj_NANR,
						0, RES_NO_START+1, CLACT_U_CELLANM_RES,ptr->HeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( ptr->ResObjTbl[1][CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( ptr->ResObjTbl[1][CLACT_U_PLTT_RES] );

	//---------ポケグラ-------------------
	//chara読み込み
	ptr->ResObjTbl[2][CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(ptr->ResMan[CLACT_U_CHAR_RES],
					    ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCGR,
					    0, RES_NO_START+2, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	//pal読み込み
	ptr->ResObjTbl[2][CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(ptr->ResMan[CLACT_U_PLTT_RES],
					    ARC_FIELD_CUTIN_GRA, NARC_field_cutin_dp_boy01_NCLR,
					    0, RES_NO_START+2, NNS_G2D_VRAM_TYPE_2DSUB, 4, ptr->HeapID);

	//cell読み込み
	ptr->ResObjTbl[2][CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELL_RES],
						ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCER,
						0, RES_NO_START+2, CLACT_U_CELL_RES,ptr->HeapID);

	//同じ関数でanim読み込み
	ptr->ResObjTbl[2][CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELLANM_RES],
						ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCER,
						0, RES_NO_START+2, CLACT_U_CELLANM_RES,ptr->HeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( ptr->ResObjTbl[2][CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( ptr->ResObjTbl[2][CLACT_U_PLTT_RES] );
}

//------------------------------------------------------------------
/**
 * @brief	セルアクターセット
 * @param	ptr		ワークポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void SetActor(PKTH_SEL_SUB_ACT *ptr)
{
	u8 i,j;
#if 0			//仕様変更で不要になった
	//ペン
	ptr->Pen = AddAct(	ptr, RES_NO_START, PRI_PEN, 0,
								PEN_X, PEN_Y, PEN_ANM_OFS, 1 );
#endif
	//メダル
	for (i=0;i<MEDAL_MAX;i++){
		ptr->Medal[i] = AddAct(	ptr, RES_NO_START, PRI_MEDAL, 0,
								MEDAL_BASE_X+i*MEDAL_OFS, MEDAL_BASE_Y, MEDAL_ANM_OFS+i, 0	);
		ptr->MedalEff[i] = AddAct(	ptr, RES_NO_START, PRI_MEDAL_EFF, 0,
									MEDAL_BASE_X+i*MEDAL_OFS, MEDAL_BASE_Y, MEDAL_EFF_ANM_OFS, 0	);
	}
	//ステータス
	for (i=0;i<PARAM_NUM;i++){
		u8 idx = PerformanceTbl[i];
		ptr->ParamAct[i].Arrow = AddAct(ptr, RES_NO_START+1, PRI_ARROW, 0,
										ARROW_X, PARAM_BASE_Y+PARAM_Y_OFS*idx, UP_ANM_OFS, 0);
		for(j=0;j<STAR_VAL_MAX;j++){
			ptr->ParamAct[i].Star[j] = AddAct(ptr, RES_NO_START+1, PRI_STAR, 0,
										STAR_X+j*STAR_X_OFS, PARAM_BASE_Y+PARAM_Y_OFS*idx, STAR_MAX_ANM_OFS, 0);
		}
	}
	//ポケグラ
	ptr->PokeAct = AddAct(ptr, RES_NO_START+2, PRI_POKE, 0,
										POKE_X, POKE_Y, 0, 0);
	ptr->PokeChar = sys_AllocMemory(ptr->HeapID, POKE_TEX_SIZE);
	AttouchPokeVramAdr( ptr );
}

//------------------------------------------------------------------
/**
 * @brief	アクター追加
 *
 * @param	ptr				コントローラ
 * @param	inResNo			リソースナンバー
 * @param	inActPri		アクタープライオリティ
 * @param	inBgPri			BGプライオリティ
 * @param	inX				X座標
 * @param	inY				Y座標
 * @param	inAnm			アニメナンバー
 * @param	inFlg			表示フラグ
 *
 * @return	CLACT_WORK_PTR		アクターポインタ
 */
//------------------------------------------------------------------
static CLACT_WORK_PTR AddAct(	PKTH_SEL_SUB_ACT *ptr, u8 inResNo, u8 inActPri, u8 inBgPri,
								int inX, int inY, int inAnm, int inFlg	)
{
	CLACT_ADD add;
	CLACT_WORK_PTR p;

	CLACT_HEADER header;

	// セルアクターヘッダ作成
	CLACT_U_MakeHeader(&header, inResNo, inResNo, inResNo, inResNo, CLACT_U_HEADER_DATA_NONE, CLACT_U_HEADER_DATA_NONE,
			     0, inBgPri,
			     ptr->ResMan[CLACT_U_CHAR_RES],
				 ptr->ResMan[CLACT_U_PLTT_RES],
			     ptr->ResMan[CLACT_U_CELL_RES],
				 ptr->ResMan[CLACT_U_CELLANM_RES],
			     NULL,NULL);

	MakeCLACT_ADD(&add, ptr->ClactSet, &header, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	add.mat.x = FX32_ONE * inX;
	add.mat.y = SUB_DISTANCE + (FX32_ONE * inY);
	add.pri   = inActPri;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, inAnm);
	CLACT_BGPriorityChg(p, 1);
	CLACT_SetDrawFlag(p, inFlg);
	return p;
}

//------------------------------------------------------------------
/**
 * @brief	CLACT_ADDの雛形を作成
 *
 * @param	add			アクター追加構造体ポインタ
 * @param	clactSet			アクターセットポインタ
 * @param	header		アクターヘッダー
 * @param	inArea		ドローエリア
 * @param	inHeapID	ヒープID
 *
 * @return	none
 */
//------------------------------------------------------------------
static void MakeCLACT_ADD(CLACT_ADD *add, CLACT_SET_PTR	clactSet, CLACT_HEADER *header, const int inArea, const int inHeapID)
{
  add->ClActSet		= clactSet;
  add->ClActHeader	= header;
  add->mat.z		= 0;
  add->sca.x		= FX32_ONE;
  add->sca.y		= FX32_ONE;
  add->sca.z		= FX32_ONE;
  add->rot		= 0;
  add->pri		= 0;
  add->DrawArea		= inArea;
  add->heap		= inHeapID;
}

//----------------------------------------------------------------------------
/**
 *	@brief	ＶＲＡＭアドレス割り当て
 *
 *	@param	ptr 				コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void AttouchPokeVramAdr( PKTH_SEL_SUB_ACT *ptr )
{
	CLACT_U_RES_OBJ_PTR res_obj_ptr;
	CLACT_U_RES_OBJ_PTR res_pal_ptr;
	NNSG2dImageProxy *image_proxy;
	const NNSG2dImagePaletteProxy *palette_proxy;

	res_obj_ptr = (ptr->ResObjTbl[2][CLACT_U_CHAR_RES]);
	res_pal_ptr = (ptr->ResObjTbl[2][CLACT_U_PLTT_RES]);

	image_proxy = CLACT_U_CharManagerGetProxy( res_obj_ptr );
	palette_proxy = CLACT_U_PlttManagerGetProxy( res_pal_ptr, image_proxy );

	ptr->ImageVram = NNS_G2dGetImageLocation( image_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
	ptr->PaletteVram = NNS_G2dGetImagePaletteLocation( palette_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
}

//----------------------------------------------------------------------------
/**
 *	@brief	アクターセットアップ
 *
 *	@param	ptr 				コントローラポインタ
 *	@param	inreDrawInfo		更新情報
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetUpPokeAct(PKTH_SEL_SUB_ACT *ptr, const PSS_REDRAW_INFO* inReDrawInfo)
{
	SOFT_SPRITE_ARC sprite;
	PokeGraArcDataGet( &sprite, inReDrawInfo->MonsNo,
								inReDrawInfo->Sex,
								PARA_FRONT,
								inReDrawInfo->Rare,
								inReDrawInfo->Form,
								inReDrawInfo->PsnlRnd );

	Ex_ChangesInto_BattlePokeData(sprite.arc_no, sprite.index_chr, ptr->HeapID,
						ptr->PokeChar, inReDrawInfo->PsnlRnd, FALSE, PARA_FRONT, inReDrawInfo->MonsNo);
	{
		NNSG2dPaletteData	*pd;
		void*				buf;
		BOOL				ret;
		//パレットデータ読み込み
		buf = ArchiveDataLoadMalloc(sprite.arc_no, sprite.index_pal, ptr->HeapID);
		ret = NNS_G2dGetUnpackedPaletteData(buf,&pd);

		GF_ASSERT(ret==TRUE);

		MI_CpuCopy16(pd->pRawData, ptr->PokePal, 0x20);

		sys_FreeMemoryEz(buf);

	}
}

//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラフィック転送
 *
 *	@param	ptr		コントローラ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void TransPokeGra( PKTH_SEL_SUB_ACT *ptr )
{
	int chr_trans_size;
	int plt_trans_size;

	chr_trans_size = (32*10)*10;	//32byte x10 y10
	plt_trans_size = 32;	//32byte


	DC_FlushRange(ptr->PokeChar,chr_trans_size);
	GXS_LoadOBJ( ptr->PokeChar, ptr->ImageVram, chr_trans_size );

	DC_FlushRange( ptr->PokePal, plt_trans_size );
	GXS_LoadOBJPltt( ptr->PokePal, ptr->PaletteVram, plt_trans_size );	//32byte 1Palette
}

